export const defaultThreeData = ()=> {
  return {
    // 定义threejs输出画布的尺寸(单位:像素px)
    width: 600,
    height: 600,
    compareSize:200,  //这个值用来进行对比比例
    bgColor:"#C0C0C0",
    scaleRate: 1,    // 记录form表单的数据，包括所有的坐标，应该以什么比例进行缩放。当数据接近或者大于width时，会明显变形，这个值就是为了避免这种情况。
  }
}

export const sealHeadTypeMap = {
  none: 0,
  top:1,
  bottom:2,
  both:3
}

/**
 * 计算数据缩放比例
 * @param maxdata 最大数据值
 * @param compareSize 比较基准大小
 * @returns 计算得到的缩放比例
 */
export function computeScaleRate(maxdata: number, compareSize: number): number {
  // 如果最大数据小于比较基准，不需要缩放
  if (maxdata < compareSize) {
    return 1;
  }

  // 计算基础缩放比例
  const data = Math.ceil(maxdata / compareSize);

  // 使用数组定义量级和对应的除数，避免重复的条件判断
  const scales = [
    { threshold: 100000000, divisor: 100000000 },
    { threshold: 10000000, divisor: 10000000 },
    { threshold: 1000000, divisor: 1000000 },
    { threshold: 100000, divisor: 100000 },
    { threshold: 10000, divisor: 10000 },
    { threshold: 1000, divisor: 1000 },
    { threshold: 100, divisor: 100 },
    { threshold: 10, divisor: 10 },
    { threshold: 1, divisor: 1 }
  ];

  // 遍历寻找合适的缩放级别
  for (const { threshold, divisor } of scales) {
    if (data > threshold) {
      return Math.ceil(data / divisor) * divisor;
    }
  }

  // 处理0和小数情况
  const res = Math.max(1, Math.round(data));
  return res;
}

//
export function saveFloatFixByScaleRate(scaleRate:number){
  if(scaleRate <=1){
    return 0
  }else{
    return parseInt(scaleRate.toString()).toString().length
  }
}

// 计算椭圆的周长
export function ellipseCircumference(a:number, b:number) {
  if(a<=0 || b<=0){
    return 0
  }
  if (a === b) { // 如果长半轴等于短半轴，即圆形
    return 2 * Math.PI * a; // 返回圆形的周长公式
  } else { // 否则，为椭圆
    let tmp = 0;
    if(a < b){   //兼容a小于b
      tmp = a
      a = b
      b = tmp
    }
    // 对于极扁长的椭圆，使用矩形周长近似
    if (a > 100 * b || b > 100 * a) { // 如果其中一个半轴比另一个大100倍以上
      return 2 * (a + b); // 使用矩形近似
    }
    // 这里是其他较为精确的方法
    var h = Math.pow((a - b) / (a + b), 2); // 使用 Ramanujan 第二类公式
    var circumference = Math.PI * (a + b) * (1 + (3 * h) / (10 + Math.sqrt(4 - 3 * h))); // 计算椭圆的周长
    return circumference;
  }
}

//计算椭圆的某一个点的坐标 已知椭圆的长轴半径，短轴半径
export function calculateEllipseXYByArc(arcLength:number,a:number,b:number){
  const perimeter = ellipseCircumference(a,b)
  // 计算给定弧长对应的角度
  var angle = (arcLength / perimeter) * 2 * Math.PI;
  // 计算弧长的另一个端点的坐标
  var x = Math.abs(a * Math.cos(angle));
  var y = Math.abs(b * Math.sin(angle));
  return {
    x,
    y
  }
}

// 根据弧长和半径 计算终点的坐标
export function calculateCircleXYByArc(arcLength:number, radius:number){
  // 计算圆周的弧长
  var circumference = 2 * Math.PI * radius;

  // 计算弧长与圆周的比例
  var ratio = arcLength / circumference;

  // 根据比例计算角度
  var angle = ratio * 2 * Math.PI;

  // 计算终点的坐标
  var x = radius * Math.cos(angle);
  var y = radius * Math.sin(angle);
  return {
    x,
    y
  };
}

//calculateObliqueSide 根据两个直角边，计算斜边长度
export function calculateObliqueSide(directSideA:number, directSideB:number) {
  directSideA = Math.abs(directSideA)
  directSideB = Math.abs(directSideB)
  // 勾股定理：斜边^2 = 直角边a^2 + 直角边b^2
  let obliqueSide = Math.sqrt(directSideA * directSideA + directSideB * directSideB);
  return obliqueSide;
}

